#ifndef FFPLAYER_FMEDIA_H
#define FFPLAYER_FMEDIA_H

#include <android/log.h>
#include <pthread.h>
#include <mutex>
#include <queue>

extern "C" {
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"

#define LOG_TAG "ffplayer"
#define LOG_I(FORMAT, ...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,FORMAT,##__VA_ARGS__);
#define LOG_E(FORMAT, ...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,FORMAT,##__VA_ARGS__);

using namespace std;

class FMedia {

public:
    FMedia();

    ~FMedia();

    // 消费音视频数据
    int pop(AVPacket *packet);

    // 生产音视频数据
    int push(AVPacket *packet);

    // 停止播放
    virtual void stop();

    // 释放资源
    virtual void release();

protected:
    // 播放线程
    pthread_t p_tid;
    // 互斥锁
    pthread_mutex_t p_mutex;
    // 条件
    pthread_cond_t p_cond;
public:
    // 解码器上下文
    AVCodecContext *codec_ctx;
    // 缓冲区
    uint8_t *out_buf;
    // 缓冲区的大小
    int buf_size;
    // 流的索引
    int stream_idx;
    // 是否正在播放
    int isPlaying;
    /*
     * 表示时间精度 = stream.time_base
     * 当前帧的时间 = packet.pts * av_q2d(time_base)
     */
    AVRational time_base;
    // 当前播放时间
    double clock;
    // 音视频数据队列
    queue<AVPacket *> p_queue;
};
};


#endif //FFPLAYER_FMEDIA_H
